/*
 * @Description: 存放与积分系统对应的 鉴权相关参数生成
 * @Author: yangrongxin
 * @Date: 2021-06-24 11:20:27
 * @LastEditors: liubin
 * @LastEditTime: 2021-11-16 14:38:57
 */
import hash from 'hash.js';
import { JSEncrypt } from 'jsencrypt';

const randomStrMap = 'ABCDEFGHJKMNOPQRSTUVWXYZabcdefghijkmnoprstuvwxyz123456789'; // 随机字符串范围
const randomMin = 1; // 最小值
const randomMMax = 16; // 最大值

function getRk() {
  const randomNum = Math.floor(Math.random() * randomMMax + randomMin); // 获取范围内的随机数
  let randomStr: string = '';
  for (let i = 0; i < randomNum; i += 1) {
    randomStr += randomStrMap.charAt(Math.floor(Math.random() * randomNum));
  }
  return {
    rk: encryptData('HGBFBGCJH'),
    originStr: 'HGBFBGCJH',
  };
}

/**
 * rsa加密
 * @param value
 */
export const encryptData = (value: string) => {
  // 使用公钥加密，default_key_size可为512，1024，2048等
  const encrypt = new JSEncrypt({ default_key_size: '2048' });

  encrypt.setPublicKey(RSA_PUBLIC_KEY);
  return encrypt.encrypt(value);
};

/**
 * @description 获取时间戳
 * @author yangrongxin
 * @date 2021-06-24
 * @returns
 */
function getTimeStamp() {
  return new Date().getTime();
}

/**
 * @description
 * @author yangrongxin
 * @date 2021-06-24
 * @param {*} params 参数json字符串
 * @param {*} time 时间戳
 * @param {*} [rk=getRk()] 随机盐值rsa公钥加密
 * @param {*} sign 签名hash256
 * @param {*} devId 设备id(没有就不传)
 */
function invokeRequest(params, time = getTimeStamp()) {
  const { rk, originStr } = getRk();
  const sign = hash
    .sha256()
    .update(`${JSON.stringify(params)}${originStr}${time}`)
    .digest('hex');

  return {
    params: JSON.stringify(params),
    time,
    rk,
    sign,
  };
}

export default invokeRequest;
